考点
代码审计(node.js)
JWT伪造
前置知识
node.js
node.js
koa框架常用目录,文件
app/controllers 项目控制器存放目录:接收请求,处理逻辑
app/dbhelper 数据库CRUD操作的封装
app/models 对应数据库表表结构
config/router.js 项目路由
node_modules app.js 项目入口
JWT
JWT 小知识
JWS:Signed JWT签名过的jwt
JWE:Encrypted JWT部分payload经过加密的jwt
JWT的组成
三个部分(用点分割)
header:主要声明JWT的签名算法
payload:主要承载了各种声明并传递明文数据
signture:拥有该部分的JWT被称为JWS,也就是签了名的JWS;没有该部分的JWT被称为nonsecure JWT,
也就是不安全的JWT,此时header中声明的签名算法为none。
JWT的形式:
1 | eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9. |
解题过程
审查元素
引入一个 app.js
文件
找到一些关键字 koa
,koa是一个基于node.js的web框架。
可以直接通过目录 controllers/api.js
访问到后端源代码,拷贝过来审计。
1 | const crypto = require('crypto'); |
node.js真的一点基础都没有,不过有语言基础,还是能勉强看得懂一些,跟着大佬的wp再来审计一遍。
解题方式
需要构造一个JWT解码后明文为下面这样的JWT,将加密方式改成none,secretid改成[],接下来需要将明文转换成JWT格式。
1 | { |
解题
首先注册一个账号
然后登录这个账号的时候抓包
后边跟了一个名为anthorization
的参数,将参数值拿到 这个平台 jwt解码 查看明文。
我们要做的就是将 HEADER 中的 alg
加密方式改成 none
,然后先将 PAYLOAD中的 secretid
改成[]
,再将username
改成admin
,但是这里的HEADER是不能直接修改,就直接给出替换内容 eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0
,然后手动将PAYLOAD中的secretid改成 [],加密后再将 SIGNATURE部分山刀,.
不删。就像下面这样。
然后将这段密文替换到anthorization
参数中,最后很重要的一个地方,也很容易忘,就是将username
改成admin
。
1 | eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0.eyJzZWNyZXRpZCI6W10sInVzZXJuYW1lIjoiYWRtaW4iLCJwYXNzd29yZCI6IjEyMyIsImlhdCI6MTYyOTUxODYwMn0. |
提交
可见返回true
获取flag
小结
这道题对node.js 和 JWT 都是一窍不通,都是硬着头皮照着大佬wp做了下来,其实之前做过jwt伪造类的题目,但是对JWT的原理并不懂,所以很快就忘掉了,这次算是巩固了一次吧,总之经验需要不断积累,原理需要深入理解。每天两道CTF题,时间就打发了。